#pragma once

#include "fxcc/core/graph/opengl3/Effect3d.h"
#include "fxcc/core/graph/opengl3/TextureCubeJack.h"
#include "fxcc/core/graph/opengl3/pbrx/LightEffect.h"
#include "fxcc/core/graph/opengl3/pbrx/HdrTexture.h"
#include "fxcc/core/graph/opengl3/pbrx/Material.h"

namespace fxcc
{
    namespace graph
    {
        namespace opengl3
        {
            namespace pbrx
            {

                struct FXCC_API Effect : public fxcc::graph::opengl3::Effect3d
                {
                    Effect();

                    void Init();

                    void Begin();

                    void End();

                    void SetMaterial(const Material& material);

                    void SetHDRTexture(const fxcc::graph::opengl3::pbrx::HdrTexture* hdrTexture);

                    void SetIrradianceMap(const fxcc::graph::opengl3::TextureCubeJack* texture);
                   
                    void SetPrefilterMap(const fxcc::graph::opengl3::TextureCubeJack* texture);

                    void SetBRDFLUTMap(const fxcc::graph::opengl3::Texture2DJack* texture);

                    static std::string FragCode();

                    static fxcc::graph::common::Defines CustomDefines();

                };
            }
        }
    }
}